﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using CondominioG1.Persistencia.NHibernate;
using CondominioG1.Dominio;
using NHibernate.Criterion;

namespace CondominioG1.Negocio
{

//HISTORIA: 
//Registro las cuotas debo indicar como mínimo la vivienda, periodo (mes o año), importe y fecha de vencimiento.	
//Espero:
//-	Confirmación del registro OK.
//-	Mensaje de error si ya se registró una cuota a la misma vivienda y periodo.

    //HISTORIA: 
//Consulto mis cuotas pendientes de pago, debo poder elegir pagar una cuota vencida o por vencer; 
//para esto deberé indicar el tipo de pago (efectivo, transferencia o tarjeta de crédito).	
//Espero: 
//-	Confirmación del pago OK indicando la fecha de la operación.
//-	Lista de cuotas por pagar actualizada.


    public class CuotaService
    {
        // Dependencias con la capa de persistencia
        public CuotaDAO CuotaDAO { get; set; }
        public ViviendaDAO ViviendaDAO { get; set; }

        public Cuota FijarCuota(String viviendaCodigo, String periodo, Decimal importe, DateTime vencimiento, Boolean estado, DateTime fecpago, String formaPago)
        {
            Int32 ctaVivPer = 0;
            // Validacion vivienda
            if (null == viviendaCodigo || String.Empty.Equals(viviendaCodigo))
                throw new Exception("Vivienda es obligatorio");
            if (ViviendaDAO.Obtener(viviendaCodigo) == null)
                throw new Exception("Vivienda inexistente");
            // Validación de periodo
            if (null == periodo|| String.Empty.Equals(periodo))
                throw new Exception("Periodo es obligatorio");
            // Validación de importe
            if (0 > importe)
                throw new Exception("Importe negativo");
            // Validación de fecha de vencimiento
            if (null == vencimiento)
                throw new Exception("Fecha de vencimiento es obligatoria");

            ////Validacion si ya se registró una cuota a la misma vivienda y periodo.  
            foreach (Cuota cuota in CuotaDAO.ListarCuotaPorViviendaPeriodo(ViviendaDAO.Obtener(viviendaCodigo), periodo))
                ctaVivPer++;
            if (ctaVivPer > 0)
                throw new Exception("Cuota ya asignada a la vivienda para el periodo: " + periodo);

            Cuota cuotaAFijar = new Cuota();
            cuotaAFijar.Vivienda = ViviendaDAO.Obtener(viviendaCodigo);
            cuotaAFijar.Periodo = periodo;
            cuotaAFijar.Importe = importe;
            cuotaAFijar.Vencimiento = vencimiento;
            cuotaAFijar.Estado = estado;
            cuotaAFijar.FecPago = fecpago;
            cuotaAFijar.FormaPago = formaPago;

            return CuotaDAO.Crear(cuotaAFijar);
        }

        public Cuota ObtenerCuota(int idNumero)
        {
            return CuotaDAO.ObtenerInt(idNumero);
        }
        public Cuota ModificarCuota(Cuota cuota)
        {
            return CuotaDAO.Modificar(cuota);
        }
        public void EliminarCuota(Cuota cuota)
        {
            CuotaDAO.Eliminar(cuota);
        }

        public Cuota PagarCuota(String viviendaCodigo, String periodo, String tipoPago)
        {
            // Validacion vivienda
            if (null == viviendaCodigo || String.Empty.Equals(viviendaCodigo))
                throw new Exception("Vivienda es obligatorio");
            // Validación de periodo
            if (null == periodo || String.Empty.Equals(periodo))
                throw new Exception("Periodo es obligatorio");
            // Validación de periodo
            if (null == tipoPago || String.Empty.Equals(tipoPago))
                throw new Exception("Tipo de pago es obligatorio");

            Vivienda vivienda = ViviendaDAO.Obtener(viviendaCodigo);

            // Validación de Vivienda y periodo registrado para la cuota
            DetachedCriteria busqueda = DetachedCriteria.For<Cuota>();
            busqueda.Add(Restrictions.Eq("Vivienda", vivienda));
            busqueda.Add(Restrictions.Eq("Periodo", periodo));
            ICollection<Cuota> cuotaBusqueda = CuotaDAO.Listar(busqueda);

            Cuota cuotaAPagar = cuotaBusqueda.First();
            cuotaAPagar.FecPago = DateTime.Now;
            cuotaAPagar.FormaPago = tipoPago;
            cuotaAPagar.Estado = true;
            CuotaDAO.Modificar(cuotaAPagar); // Envío la actualización del objeto a la BD
            return cuotaAPagar;

        }

        public ICollection<Cuota> CuotasPendientesPorVivienda(Vivienda vivienda)
        {
            return CuotaDAO.ListarCuotasPendientesPorVivienda(vivienda);
        }
        public ICollection<Cuota> ListarTodasCuotas()
        {
            return CuotaDAO.Listar(DetachedCriteria.For<Cuota>());
        }

        public ICollection<Cuota> ListaCuotasPorPagar()
        {
            return CuotaDAO.ListarCuotasporVencer();
        }

        public ICollection<Cuota> ConsultarMorosos()
        {
             return CuotaDAO.ListarCuotaPorFecha(DateTime.Now, false);
        }

        public void EliminaCuotas()
        {
            foreach (Cuota cuota in CuotaDAO.Listar(DetachedCriteria.For<Cuota>()))
                CuotaDAO.Eliminar(cuota);
        }
    }
}
